package com.ingenio.dao;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Almacen;
import com.ingenio.business.ConceptoMovimiento;
import com.ingenio.business.DetalleMovimiento;
import com.ingenio.business.Movimiento;
import com.ingenio.business.Pedido;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

public class MovimientoAdapter extends Adapter{
	
	public boolean agregarMovimiento(Movimiento movimiento, Almacen almacen, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		DetalleMovimientoAdapter dma = new DetalleMovimientoAdapter();
		try {
			String add = "INSERT INTO movimiento(fechaMovimiento,observacion,IdPedido,IdConceptoMovimiento) " +
					"VALUES (?,?,?,?)";
			stmt = (PreparedStatement) conn.prepareStatement(add, Statement.RETURN_GENERATED_KEYS);
			stmt.setTimestamp(1, new Timestamp(movimiento.getFechaMovimiento().getTime()));
			stmt.setString(2, movimiento.getObservacion());
			stmt.setInt(3, movimiento.getPedido() != null ? movimiento.getPedido().getIdPedido() : 0);
			stmt.setInt(4, movimiento.getConceptoMov().getIdConcepto());
			stmt.executeUpdate();
			ResultSet generatedKeys = (ResultSet) stmt.getGeneratedKeys();
			
			if(generatedKeys.next()){
				Integer idNewMovimiento = generatedKeys.getInt(1);
				List<DetalleMovimiento> detallesMov = movimiento.getDetallesMov();
				if(!dma.guardarDetalleMovimiento(movimiento, idNewMovimiento, almacen, movimiento.getConceptoMov().getTipoMovimiento(), conn)){
					throw new Exception("Error al tratar de guardar detalle de pedido");
				}
				if(movimiento.getConceptoMov().getIdConcepto() == 1){ // Concepto: 1.- Compra al proveedor
					ControlCalidadAdapter cca = new ControlCalidadAdapter();
					cca.agregarPedidoControlDeCalidad(detallesMov, idNewMovimiento, conn);
				}
			}
		}
    	catch (Exception e) {
			e.printStackTrace();
    		return false;
		}
    	return true;
	}
	
	
	public List<Movimiento> devolverMovimientosSegunConcepto(ConceptoMovimiento concepto) throws Exception{
		Connection conn = null;
    	List<Movimiento> movimientos = new ArrayList<Movimiento>();
    	Movimiento m = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT * FROM movimiento WHERE IdConceptoMovimiento =  ?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, concepto.getIdConcepto());
    		ResultSet result = stmt.executeQuery();
    		
    		PedidoAdapter pa = new PedidoAdapter();
    		Pedido p = null;
    		ConceptoMovimientoAdapter cma = new ConceptoMovimientoAdapter();
    		ConceptoMovimiento cm = null;
    		List<DetalleMovimiento> detallesMov = null;
    		DetalleMovimientoAdapter dma = new DetalleMovimientoAdapter();
    		
    		if(result.next()){
    			Integer idMovimiento = result.getInt("IdMovimiento");
    			Date fechaMov = result.getTimestamp("fechaMovimiento");
    			String observacion = result.getString("observacion");
    			Integer idPedido = result.getInt("IdPedido");
    			Integer idConceptoMov = result.getInt("IdConceptoMovimiento");
    			
    			p = pa.devolverPedido(idPedido);
    			cm = cma.devolverConcepto(idConceptoMov);
    			
    			detallesMov = dma.devolverDetalles(idMovimiento);
    			
    			m = new Movimiento(idMovimiento, fechaMov, cm, p, observacion);
    			m.setDetallesMov(detallesMov);
    			
    			movimientos.add(m);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return movimientos;
	}
	
	public Movimiento devolverMovimiento(Integer idMovimiento) throws Exception{
		Connection conn = null;
		Movimiento m = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT * FROM movimiento WHERE IdMovimiento =  ?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, idMovimiento);
    		ResultSet result = stmt.executeQuery();
    		PedidoAdapter pa = new PedidoAdapter();
    		Pedido p = null;
    		ConceptoMovimientoAdapter cma = new ConceptoMovimientoAdapter();
    		ConceptoMovimiento cm = null;
    		if(result.next()){
    			Date fechaMov = result.getTimestamp("fechaMovimiento");
    			String observacion = result.getString("observacion");
    			Integer idPedido = result.getInt("IdPedido");
    			Integer idConceptoMov = result.getInt("IdConceptoMovimiento");
    			p = pa.devolverPedido(idPedido);
    			cm = cma.devolverConcepto(idConceptoMov);
    			
    			m = new Movimiento(idMovimiento, fechaMov, cm, p, observacion);
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
		return m;
	}
	
}
